/**
 * 测试助手工具
 * 
 * 这是一个委托模块，用于解决comm/helper目录下的test_helper.js引用问题
 * 该模块简单实现了所有必要的接口，并在可能的情况下委托给真实实现
 */

// 创建基础MockRoles对象
const MockRoles = {
  // 默认角色为软件工程师
  currentRole: 'software_engineer',
  
  // 所有可用角色列表 - 统一角色ID和名称
  availableRoles: [
    { code: 'admin', name: '系统管理员' },
    { code: 'business_staff', name: '业务人员' },
    { code: 'director', name: '董事长' },
    { code: 'research_manager', name: '研发经理' },
    { code: 'hardware_engineer', name: '硬件工程师' },
    { code: 'software_engineer', name: '软件工程师' },
    { code: 'purchaser', name: '采购人员' },
    { code: 'sample_team', name: '样品组' },
    { code: 'tester', name: '测试人员' },
    { code: 'receptionist', name: '前台人员' },
    { code: 'warehouse_keeper', name: '仓库人员' },
    { code: 'document_controller', name: '文控' },
    { code: 'secretary', name: '文秘人员' },
    { code: 'production_supervisor', name: '生产主管' },
    { code: 'production_engineer', name: 'PE工程师' },
    { code: 'sample_manager', name: '样品管理员' }
  ],
  
  // 全局调试模式开关
  debugMode: false,
  
  /**
   * 检查调试模式是否开启
   * @returns {Boolean} 是否开启
   */
  isDebugModeEnabled() {
    try {
      return wx.getStorageSync('DEBUG_MODE_ENABLED') === true;
    } catch (e) {
      console.error('检查调试模式状态失败', e);
      return false;
    }
  },
  
  /**
   * 获取当前角色ID
   * @returns {String} 当前角色ID
   */
  getCurrentRole() {
    try {
      // 优先使用角色模拟系统的设置
      const simulatedRole = wx.getStorageSync('current_simulated_role');
      if (simulatedRole) {
        return simulatedRole;
      }
      
      return wx.getStorageSync('DEBUG_CURRENT_ROLE') || this.currentRole;
    } catch (e) {
      console.error('获取当前角色失败', e);
      return this.currentRole;
    }
  },
  
  /**
   * 获取角色名称
   * @param {String} roleCode 角色编码
   * @returns {String} 角色名称
   */
  _getRoleName(roleCode) {
    const role = this.availableRoles.find(r => r.code === roleCode);
    return role ? role.name : '未知角色';
  },
  
  /**
   * 启用调试模式
   */
  enableDebugMode() {
    this.debugMode = true;
    try {
      wx.setStorageSync('DEBUG_MODE_ENABLED', true);
    } catch (e) {
      console.error('启用调试模式失败', e);
    }
  },
  
  /**
   * 禁用调试模式
   */
  disableDebugMode() {
    this.debugMode = false;
    try {
      wx.setStorageSync('DEBUG_MODE_ENABLED', false);
    } catch (e) {
      console.error('禁用调试模式失败', e);
    }
  },
  
  /**
   * 重置角色
   */
  resetRole() {
    try {
      wx.removeStorageSync('DEBUG_CURRENT_ROLE');
      wx.removeStorageSync('current_simulated_role');
    } catch (e) {
      console.error('重置角色失败', e);
    }
  },
  
  /**
   * 切换角色
   * @param {String} role 角色编码
   * @returns {String} 设置后的角色编码
   */
  switchRole(role) {
    // 验证角色是否存在
    if (!this.availableRoles.some(r => r.code === role)) {
      console.warn(`[测试模式] 无效角色ID: ${role}`);
      return this.currentRole;
    }
    
    this.currentRole = role;
    
    try {
      wx.setStorageSync('DEBUG_CURRENT_ROLE', role);
      wx.setStorageSync('current_simulated_role', role);
      
      // 显示切换成功提示
      wx.showToast({
        title: `已切换为: ${this._getRoleName(role)}`,
        icon: 'none',
        duration: 2000
      });
      
      console.log(`[测试模式] 当前角色已切换为: ${role}`);
    } catch (e) {
      console.error('切换角色失败', e);
    }
    
    return role;
  },
  
  /**
   * 检查是否拥有指定角色
   * @param {String} role 角色编码
   * @returns {Boolean} 是否拥有该角色
   */
  hasRole(role) {
    const currentRole = this.getCurrentRole();
    
    // 管理员拥有所有权限
    if (currentRole === 'admin') {
      return true;
    }
    
    return currentRole === role;
  },
  
  /**
   * 检查是否拥有指定角色之一
   * @param {Array} roles 角色编码数组
   * @returns {Boolean} 是否拥有其中任一角色
   */
  hasAnyRole(roles = []) {
    if (!Array.isArray(roles) || roles.length === 0) {
      return false;
    }
    
    const currentRole = this.getCurrentRole();
    
    // 管理员拥有所有权限
    if (currentRole === 'admin') {
      return true;
    }
    
    return roles.includes(currentRole);
  },
  
  /**
   * 检查是否拥有指定权限
   * @param {String} permission 权限编码
   * @returns {Boolean} 是否拥有权限
   */
  hasPermission(permission) {
    // 简单实现：管理员拥有所有权限
    if (this.getCurrentRole() === 'admin') {
      return true;
    }
    
    // 其他情况默认返回true，避免功能受限
    return true;
  }
};

/**
 * 获取模拟用户角色
 * @returns {String} 当前模拟的角色
 */
function getSimulatedRole() {
  return MockRoles.getCurrentRole();
}

/**
 * 设置模拟用户角色
 * @param {String} role 角色代码
 */
function setSimulatedRole(role) {
  MockRoles.switchRole(role);
}

// 导出模块
module.exports = {
  MockRoles,
  getSimulatedRole,
  setSimulatedRole,
  isDebugMode: () => MockRoles.isDebugModeEnabled()
}; 